home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
051-075
/
disk_066
/
flip
/
flip.s
< prev
Wrap
Text File
|
1992-05-06
|
6KB
|
226 lines
* flip.s
* 5 Apr 87
*
* Written by Mike Berro of BCS Software
* (818) 362-6031 CIS: [73267,3361]
* Based on tilt.c by Leo L. Schwab
* I hacked this together in 2 hours; C into assembly is no problem!
* It is slow because of the need to flip individual bits left to right.
* It'd be a LOT slower in C! Is there a faster way to do the flip?
* How about turning the display sideways?
* You can insert your own effects in the effects subroutine.
INCLUDE "exec/types.i"
INCLUDE "exec/nodes.i"
INCLUDE "exec/lists.i"
INCLUDE "exec/ports.i"
INCLUDE "exec/libraries.i"
INCLUDE "exec/tasks.i"
INCLUDE "intuition/intuition.i"
INCLUDE "graphics/display.i"
INCLUDE "graphics/gfxbase.i"
XREF _AbsExecBase
XREF _LVOOpenLibrary ;intuition
XREF _LVOCloseLibrary
XREF _LVOOpenWindow
XREF _LVOCloseWindow
XREF _LVOOpenScreen
XREF _LVOCloseScreen
XREF _LVOScreenToFront
XREF _LVOScreenToBack
XREF _LVODisplayAlert
XREF _LVOBltBitMap ;graphics
moveq.l #101,d6 ;d6 is the error flag: 101=can't open Intui
lea IntuitionName,a1
moveq.l #0,d0
movea.l _AbsExecBase,a6
jsr _LVOOpenLibrary(a6)
move.l d0,IntuitionBase
beq all_done
addq.l #1,d6 ;102=can't open Graphics Library
lea GraphicsName,a1
moveq.l #0,d0
movea.l _AbsExecBase,a6
jsr _LVOOpenLibrary(a6)
move.l d0,GraphicsBase
beq all_done
addq.l #1,d6 ;103=can't open window
lea MyNewWindow,a0
movea.l IntuitionBase,a6
jsr _LVOOpenWindow(a6)
move.l d0,MyWindow
beq all_done
addq.l #1,d6 ;104=can't open screen
move.l MyWindow,a0
move.l wd_WScreen(a0),a1 ;a1 points to WBench screen
move.l sc_RastPort+rp_BitMap(a1),wbm ;points to Workbench BitMap structure
lea MyNewScreen,a0
move.w sc_LeftEdge(a1),ns_LeftEdge(a0)
move.w sc_TopEdge(a1),ns_TopEdge(a0)
moveq.l #0,d4
move.w sc_Width(a1),d4 ;save for BltBitMap
move.w d4,ns_Width(a0)
moveq.l #0,d5
move.w sc_Height(a1),d5 ;save for BltBitMap
move.w d5,ns_Height(a0)
move.w sc_ViewPort+vp_Modes(a1),ns_ViewModes(a0)
jsr _LVOOpenScreen(a6)
move.l d0,MyScreen
beq all_done
move.l d0,a0
jsr _LVOScreenToBack(a6)
move.l MyScreen,a1
move.l sc_RastPort+rp_BitMap(a1),a1 ;my BitMap
move.l a1,a2
adda.l #bm_Planes,a2
move.l (a2)+,Plane1 ;points to actual video memory
move.l (a2)+,Plane2
move.l wbm,a0 ;WB's BitMap
moveq.l #0,d0 ;faster than clr.l
moveq.l #0,d1
moveq.l #0,d2
moveq.l #0,d3
move.l #$c0,d6
move.l #$ff,d7
move.l #0,a2
movea.l GraphicsBase,a6
jsr _LVOBltBitMap(a6) ;copy WB onto my custom screen
movea.l Plane1,a0
bsr do_flip ;do the effect on plane1
movea.l Plane2,a0
bsr do_flip ;and on plane 2
movea.l MyScreen,a0
movea.l IntuitionBase,a6
jsr _LVOScreenToFront(a6) ;show it
move.l #800000,d0
lp_delay:
subq.l #1,d0
bne.s lp_delay
move.l #RECOVERY_ALERT,d0
lea message,a0
moveq.l #30,d1
jsr _LVODisplayAlert(a6) ;pseudo-guru
moveq.l #0,d6 ;no error
all_done:
movea.l IntuitionBase,a6
tst.l MyScreen
beq.s 2$
movea.l MyScreen,a0
jsr _LVOCloseScreen(a6)
2$:
tst.l MyWindow
beq.s 3$
movea.l MyWindow,a0
jsr _LVOCloseWindow(a6)
3$:
move.l _AbsExecBase,a6
tst.l GraphicsBase
beq.s 4$
move.l GraphicsBase,a1
jsr _LVOCloseLibrary(a6)
4$:
tst.l IntuitionBase
beq.s 5$
move.l IntuitionBase,a1
jsr _LVOCloseLibrary(a6)
5$:
move.l d6,d0
rts
**************** Effects subroutine
do_flip:
move.l a0,a1
add.l #16000,a1
move.l #100,d0 ;# lines
lp_flip1:
move.l #20,d1 ;# long words per line
lp_flip2:
move.l (a0),d2
bsr sideflip
move.l -(a1),d2
move.l d5,(a1)
bsr sideflip
move.l d5,(a0)+
subq.l #1,d1
bne.s lp_flip2
subq.l #1,d0
bne.s lp_flip1
rts
sideflip:
moveq.l #0,d5 ;clear the target
moveq.l #31,d3 ;source bit number index
moveq.l #0,d4 ;target " " "
lp_sideflip:
btst.l d3,d2
beq.s 1$
bset.l d4,d5
1$:
addq.l #1,d4
subq.l #1,d3
bpl.s lp_sideflip
rts
SECTION fdata,DATA
IntuitionBase: dc.l 0
GraphicsBase: dc.l 0
MyWindow: dc.l 0
MyScreen: dc.l 0
wbm: dc.l 0
Plane1: dc.l 0
Plane2: dc.l 0
**************** Screen data
MyNewScreen: dc.w 0,0,0,0 ;size filled in later
dc.w 2 ;depth
dc.b 0,1
dc.w 0 ;viewmodes filled in later
dc.w CUSTOMSCREEN
dc.l 0
dc.l 0 ;screen title
dc.l 0,0
**************** Window data
MyFlags EQU SMART_REFRESH!ACTIVATE!WINDOWDEPTH!WINDOWDRAG
MyNewWindow: dc.w 0,30,100,10
dc.b -1,-1
dc.l 0
dc.l MyFlags
dc.l 0,0
dc.l MyTitle
dc.l 0,0
dc.w 0,0,0,0
dc.w WBENCHSCREEN
MyTitle:
dc.b 'Flip',0
IntuitionName:
dc.b 'intuition.library',0
GraphicsName:
dc.b 'graphics.library',0
message:
dc.b 1,34,22
dc.b 'Flipped Out!',0
END